package com.service.admin.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
@Slf4j
public class MemCacheNoTran {
	/**
	 * redis的key的拼接字符串
	 */
	public static final String SPLIT_STR = ":";
	public static String dailyHeader = "daily:";

	@Autowired
	protected StringRedisTemplate redisTemplate;

	/**
	 * 新增不过期的数据
	 */
	public String setNoExpire(String key, String value) {
		redisTemplate.opsForValue().set(key, value);
		return "OK";
	}

	/**
	 * 设置带过期时间的数据
	 */
	public String set(String key, String value, int expireSeconds) {
		redisTemplate.opsForValue().set(key, value, expireSeconds, TimeUnit.SECONDS);
		return "OK";
	}

	/**
	 * 设置Mmap缓存数据
	 */
	public void set(String key, Map<String, String> values) {
		redisTemplate.opsForHash().putAll(key, values);
	}

	/**
	 * 读取
	 */
	public String get(String key) {
        log.info("redis取值：{}",redisTemplate.opsForValue().get(key));
		return redisTemplate.opsForValue().get(key);
	}

	/**
	 * 读取
	 */
	public String hget(String key, String field) {
		Object value = redisTemplate.opsForHash().get(key, field);
		return value == null ? null : value.toString();
	}
	
	public void hmset(String key, Map<String, String> hash){
		redisTemplate.opsForHash().putAll(key, hash);
	}

	public Map<String, String> hgetAll(String key){
		Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
		Map<String, String> values = new HashMap<>();
		for (Object k: entries.keySet() ) {
			values.put(k.toString(),entries.get(k).toString());
		}
		return values;
	}
	
	/**
	 * 拼接数据
	 */
	public Integer append(String key, String value) {
		return redisTemplate.opsForValue().append(key, value);
	}


	/**
	 * 删除
	 */
	public void delete(String... keys) {
		redisTemplate.delete(Arrays.asList(keys));
	}

	/**
	 * 设置到期时间
	 */
	public void expire(String key, int seconds) {
		redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
	}

	/**
	 * 获取(删除用)
	 */
	public Set<String> keys(String keys) {
		return redisTemplate.keys(keys);
	}

	/**
	 * 按字符匹配删除
	 */
	public void removeByPattern(String key) {
		Set<String> keys = this.keys(key);
		redisTemplate.delete(keys);
	}

	/**
	 * 设置自增过期
	 * @param key
	 * @return
	 * 2016年11月17日 下午1:18:04 liuhuangle@wident.cn
	 */
	public Long incr(String key) {
		Long increment = redisTemplate.opsForValue().increment(key, 1);
		return increment;
	}
	/**
	 * 设置自增过期
	 * @param key
	 * @param seconds
	 * @return
	 * 2016年11月17日 下午1:18:04 liuhuangle@wident.cn
	 */
	public Long incr(String key, int seconds) {
		Long increment = redisTemplate.opsForValue().increment(key, 1);
		this.expire(key, seconds);
		return increment;
	}

	/**
	 * 包含某个值
	 */
	public boolean exists(String key) {
		return redisTemplate.hasKey(key);
	}

	/**
	 * 设置每天清空的值
	 * @param key
	 * @param user
	 */
	public String getDailyExpire(String key, String user){
		key = addPrefix(key, dailyHeader);
		Object value = hget(key, user);
		return value == null? null : value.toString();
	}

	/**
	 * 添加前缀字符串redis以:分隔
	 * @param key
	 * @param dailyHeader
	 * @return
	 */
	public String addPrefix(String key, String dailyHeader) {
		if(!key.startsWith(dailyHeader)){//添加头部
			key = dailyHeader + key;
		}
		return key;
	}


	/**
	 * 往redis中存入一个值，放入key对应的map中
	 * @param key
	 * @param filed
	 * @param value
	 */
	public void putHash(String key,String filed,String value){
		redisTemplate.opsForHash().put(key,filed,value);
	}

	/**
	 * 往redis中存入一个map
	 * @param key
	 * @param valueMap
	 */
	public void putHash(String key,Map<String,String> valueMap){
		redisTemplate.opsForHash().putAll(key,valueMap);
	}

	/**
	 * 删除key对应的map中指定的filed
 	 * @param key
	 * @param filed
	 * @return
	 */
	public void deleteHash(String key,String filed){
		redisTemplate.opsForHash().delete(key,filed);
	}

	/**
	 * 获取hash中的所有key
	 * @param key
	 * @return
	 */
	public Map<Object, Object> getHash(String key){
		return redisTemplate.opsForHash().entries(key);
	}
	/**
	 * 获取hash中的value
	 * @param key
	 * @param filed
	 * @return
	 */
	public Object getHashValue(String key,String filed){
		return redisTemplate.opsForHash().get(key,filed);
	}

	/**
	 * 获取hash中的所有key
	 * @param key
	 * @return
	 */
	public Set<Object> getHashKeys(String key){
		return redisTemplate.opsForHash().keys(key);
	}

	/**
	 * 增加一个有序集合
	 * @param key    key
	 * @param value  value  唯一
	 * @param source   排序分数
	 */
	public void  addZSet(String key,String value,double source){
		redisTemplate.opsForZSet().add(key,value,source);
	}
	/**
	 * 清空有序集合
	 * @param key
	 */
	public Long clearZSet(String key){
		Long size = redisTemplate.opsForZSet().size(key);
		return redisTemplate.opsForZSet().removeRangeByScore(key,0,size);
	}

	/**
	 * 从有序集合中移除一个元素
	 * @param key
	 * @param value
	 */
	public void removeZSet(String key,String value){
		redisTemplate.opsForZSet().remove(key,value);
	}

	/**
	 * 返回指定区间内的元素，顺序由小到大
	 * @param key    key
	 * @param start	 开始坐标
	 * @param end	结束坐标
	 * @return
	 */
	public Set<String> getZSet(String key,long start,long end){
		Set<String> range = redisTemplate.opsForZSet().range(key, start, end);
		return range;
	}

	/**
	 * 查询当前集合中的记录数
	 * @param key
	 * @return
	 */
	public Long countZSet(String key){
		Long count = redisTemplate.opsForZSet().zCard(key);
		return count;
	}


	/**
	 * 返回指定区间内的元素，顺序由大到小
	 * @param key    key
	 * @param start	 开始坐标
	 * @param end	结束坐标
	 * @return
	 */
	public Set<String> getReverseZSet(String key,long start,long end){
		Set<String> range = redisTemplate.opsForZSet().reverseRange(key, start, end);
		return range;
	}


	/**
	 *  在列表头部增加一个元素，如果列表不存在则创建一个新列表
	 * @param key   列表的key
	 * @param value  插入的value
	 * @return  插入后的列表长度
	 */
	public Long leftPush(String key,String value){
		Long count = redisTemplate.opsForList().leftPush(key, value);
		return count;
	}

	/**
	 * 弹出列表最左边的一个元素，弹出之后，此元素不再存在列表中
	 * @param key  列表的key
	 * @return
	 */
	public String leftPop(String key){
		String value = redisTemplate.opsForList().leftPop(key);
		return value;
	}



	/**
	 * 弹出列表最右边的一个元素，弹出之后，此元素不再存在列表中
	 * @param key  列表的key
	 * @return
	 */
	public String rightPop(String key){
		String value = redisTemplate.opsForList().rightPop(key);
		return value;
	}
}
